/**
 * 
 */
package testes.vSys.jUnitTestes;

import java.io.File;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;

import junit.framework.TestCase;
import testes.vSys.bean.EventType;
import testes.vSys.bean.Moviment;
import testes.vSys.bean.Vehicle;
import testes.vSys.dao.DAOFactory;
import testes.vSys.dao.IMovimentDao;
import testes.vSys.dao.IVehicleDao;
import testes.vSys.database.DatabaseController;

/**
 * @author caio.saad
 *
 */
public class _hsql_MovimentDaoTest_A5 extends TestCase {

	private IMovimentDao movimentDao;
	private IVehicleDao vehicleDao;


	public void setUp() throws Exception {
		super.setUp();

		String path = (new File("./")).getCanonicalPath();
		
		System.out.println(path);
		
		// comando de inicialização da base de dados
		boolean initialized = DatabaseController.initiate(path+"/VSys/WEB-INF/databaseConnection.properties");
		movimentDao = DAOFactory.getMovimentDao();
		vehicleDao = DAOFactory.getVehicleDao();

		System.out.println("[VSys] Inicialização da base de dados: "+ initialized);
	}

	/**
	 * Test method for {@link testes.vSys.dao._hsql_MovimentDao#createMoviment(testes.vSys.bean.Moviment)}.
	 */
	public void testCreateMoviment() {


		Moviment moviment = generateRandomMovimentForTests(1, 1, new Date());

		Moviment mv = movimentDao.createMoviment(moviment);

		assertTrue((mv != null) && (mv.getId() != 0));
	}

	/**
	 * Test method for {@link testes.vSys.dao._hsql_MovimentDao#getMovimentBetween(java.util.Date, java.util.Date)}.
	 */
	public void testGetMovimentBetween() {

		try{
			Date date1 = new GregorianCalendar(2010, Calendar.OCTOBER, 10).getTime();
			Moviment mov2 = movimentDao.createMoviment(generateRandomMovimentForTests(1, 1, new GregorianCalendar(2010, Calendar.OCTOBER, 15).getTime()));
			Moviment mov3 = movimentDao.createMoviment(generateRandomMovimentForTests(1, 1, new GregorianCalendar(2010, Calendar.OCTOBER, 18).getTime()));
			Date date2 = new GregorianCalendar(2010, Calendar.OCTOBER, 20).getTime();
			movimentDao.createMoviment(generateRandomMovimentForTests(1, 1, new GregorianCalendar(2010, Calendar.OCTOBER, 22).getTime()));

			Collection<Moviment> moviments = movimentDao.getMovimentBetween(date1, date2);
			Iterator<Moviment> iMov = moviments.iterator();
			
			if (moviments == null)
				fail("Problemas ao rodar a bucsa");

				if (moviments.size() != 2)
				fail("A busca não retornou o número correto de registros");
			
			while (iMov.hasNext()){
				Moviment m = iMov.next();
				assertTrue(((m.getId() == mov2.getId()) || (m.getId() == mov3.getId())));
			}
			

		movimentDao.removeMoviment(mov2.getId());
		movimentDao.removeMoviment(mov3.getId());
			
		}catch (Exception e) {
			fail("Estourou uma exceção");
		}
	}

	/**
	 * Test method for {@link testes.vSys.dao._hsql_MovimentDao#getMovimentByVehicle(testes.vSys.bean.Vehicle)}.
	 */
	public void testGetMovimentByVehicle() {
		Moviment moviment = generateRandomMovimentForTests(1, 1, new Date());
		Moviment newMoviment = movimentDao.createMoviment(moviment);

		Collection<Moviment> moviments = movimentDao.getMovimentByVehicle(newMoviment.getVehicle());
		Iterator<Moviment> iMov = moviments.iterator();
		if (iMov.hasNext()){
			Moviment m = iMov.next();
			assertTrue(m.getVehicle().getId() == newMoviment.getVehicle().getId() );
		} else {		
			fail("A busca por movimentos não retornou resultado.");
		}
		
	}

	/**
	 * Test method for {@link testes.vSys.dao._hsql_MovimentDao#getAvaiableEvents()}.
	 */
	public void testGetAvaiableEvents() {

		Collection<EventType> events = movimentDao.getAvaiableEvents();

		assertTrue(events != null && events.size() != 0);
	}

	/**
	 * Test method for {@link testes.vSys.dao._hsql_MovimentDao#removeMoviment(int)}.
	 */
	public void testRemoveMoviment() {

		Moviment mov = movimentDao.createMoviment(generateRandomMovimentForTests(1, 1, new Date()));
		if (mov.getId() == 0)
			fail("O teste não foi realizado porque não foi possível pré inserir os dados para poder apagá-los");

		boolean removed = movimentDao.removeMoviment(mov.getId());

		assertTrue(removed);
	}

	/**
	 * Test method for {@link testes.vSys.dao._hsql_MovimentDao#updateMoviment(testes.vSys.bean.Moviment)}.
	 */
	public void testUpdateMoviment() {
		
		Moviment mov = movimentDao.createMoviment(generateRandomMovimentForTests(1, 1, new Date()));
		if (mov.getId() == 0)
			fail("O teste não foi realizado porque não foi possível pré inserir os dados para poder atualizá-los");		
		
		Date newDate = new Date();		
		
		mov.setDate(newDate);

		boolean updated = movimentDao.updateMoviment(mov);

		assertTrue(updated);

		
		

	}

	/**
	 * Test method for {@link testes.vSys.dao._hsql_MovimentDao#getMoviment(testes.vSys.bean.Moviment)}.
	 */
	public void testGetMoviment() {
		
		Moviment moviment = generateRandomMovimentForTests(1, 1, new Date());

		Moviment newMoviment = movimentDao.createMoviment(moviment);

		
		Collection<Moviment> moviments = movimentDao.getMoviment(newMoviment);
		
		if (moviments == null)
			fail("A busca retornou um null pointer");
		
		Iterator<Moviment> iMov = moviments.iterator();
		if (iMov.hasNext()){
			Moviment m = iMov.next();
			assertTrue(m.getId() == newMoviment.getId());
		} else {		
			fail("A busca por movimentos não retornou resultado.");
		}
	}

	/**
	 * Test method for {@link testes.vSys.dao._hsql_MovimentDao#getEvent(int)}.
	 */
	public void testGetEvent() {

		EventType ev = movimentDao.getEvent(1);
		assertNotNull(ev);
	}

	/**
	 * método criado para dar suporte aos testes.
	 * Sua função é criar um moviment para ser utilizado nos testes.
	 * @param eventTypeId
	 * @param vehicleId
	 * @param date
	 * @return
	 */
	private Moviment generateRandomMovimentForTests(int eventTypeId, int vehicleId, Date date){

		EventType ev = movimentDao.getEvent(eventTypeId);
		Vehicle v = vehicleDao.getVehicleById(vehicleId);

		if (ev == null)
			fail("Não existe o eventType ID "+eventTypeId+" pré cadastrado na base de dados para realizar este teste");

		if (v == null)
			fail("Não existe o vehicle ID "+vehicleId+" pré cadastrado na base de dados para realizar este teste");

		Moviment moviment = new Moviment();
		moviment.setDate(date);
		moviment.setEventType(ev);
		moviment.setKilometers(((int)Math.random())%1000);
		moviment.setKm(((int)Math.random())%1000);
		moviment.setValue(((int)Math.random())%200);
		moviment.setVehicle(v);

		return moviment;
	}

}

